home *** CD-ROM | disk | FTP | other *** search
/ Young Minds / Young Minds Interactive CD-ROM.ISO / sdi / argv.c < prev    next >
Encoding:
C/C++ Source or Header  |  1989-08-08  |  4.9 KB  |  209 lines

  1. /******************************************  argv.c  *******************/
  2. #include "sdi.h"
  3. #include <sunwindow/notify.h>
  4. #include <stdio.h>
  5.  
  6. /*
  7.  * Copyright 1987 by Mark Weiser.
  8.  * Permission to reproduce and use in any manner whatsoever on Suns is granted
  9.  * so long as this copyright and other identifying marks of authorship
  10.  * in the code and the game remain intact and visible.  Use of this code
  11.  * in other products is reserved to me--I'm working on Mac and IBM versions.
  12.  */
  13.  
  14. /*
  15.  * Handle command line arguments, and do some font fiddling.
  16.  */
  17.  
  18. process_args(argc, argv)
  19. int argc;
  20. char **argv;
  21. {
  22.     extern int time_to_play, 
  23.             starting_icon,
  24.             starting_icon_time,
  25.             starting_level,
  26.             starting_skill,
  27.             restoring_game;
  28.     while (--argc > 0) {
  29.         argv++;
  30.         if ((*argv)[0] != '-') {
  31.             fprintf(stderr, "Unrecognizable argument '%s'.\n", *argv);
  32.             exit(1);
  33.         } else {
  34.             switch((*argv)[1]) {
  35.                 case 'b': {
  36.                     /* name of a file with a blast pixrect to use */
  37.                     struct pixrect *pr, *icon_load_mpr();
  38.                     char error_msg[256], *oldv = *argv;
  39.                     argc--; argv++;
  40.                     if (! out_of_args(argc, oldv)) {
  41.                         if ((pr = icon_load_mpr(*argv, error_msg)) == NULL) {
  42.                             printf("Could not get pr '%s'.\n", *argv);
  43.                             printf("%s",error_msg);
  44.                         } else {
  45.                             switch(oldv[2]) {
  46.         /* cities */            case 'c': change_circ(citykillcircles, pr); break;
  47.         /* lasers */            case 'l': change_circ(lasercircles, pr); break;
  48.         /* laser ends */        case 'k': change_circ(laserkillcircles, pr); break;
  49.         /* missile death */        case 'm': change_circ(blastkillcircles, pr); break;
  50.         /* interceptors */        case 'b': change_circ(bigblastcircles, pr); break;
  51.                                 default: {
  52.                                     printf("unrecognized option: '%s'.\n",oldv);
  53.                                     exit(1);
  54.                                 }
  55.                             }
  56.                         }
  57.                     }
  58.                     break;
  59.                 }
  60.                 case 'c': {
  61.                     /* name of a file with a city pixrect to use */
  62.                     argc--; argv++;
  63.                     if (! out_of_args(argc, "-c")) {
  64.                         init_city_bits(*argv);
  65.                     }
  66.                     break;
  67.                 }    
  68.                 case 'd': {
  69.                     /* delay to use between screen updates */
  70.                     argc--; argv++;
  71.                     if (! out_of_args(argc, "-d")) {
  72.                         blast_delay = atol(*argv);
  73.                     }
  74.                     break;
  75.                 }
  76.                 case 'f': {
  77.                     /* new score file */
  78.                     argc--; argv++;
  79.                     if (! out_of_args(argc, "-f")) {
  80.                         scorefile = *argv;
  81.                     }
  82.                     break;
  83.                 }    
  84.                 case 'g': {
  85.                     extern int gamemaster;
  86.                     /* set gamemaster mode */
  87.                     gamemaster = 1;
  88.                     break;
  89.                 }
  90.                 case 'h': {
  91.                     /* height of playing windows */
  92.                     argc--; argv++;
  93.                     if (! out_of_args(argc, "-h")) {
  94.                         max_y = max(MINWIN, atol(*argv));
  95.                     }
  96.                     break;
  97.                 }    
  98.                 case 'i': {
  99.                     /* starting icon type */
  100.                     argc--; argv++;
  101.                     if (! out_of_args(argc, "-i")) {
  102.                         starting_icon = atol(*argv);
  103.                         starting_icon = min(2, max(0, starting_icon));
  104.                     }
  105.                     /* starting icon time */
  106.                     argc--; argv++;
  107.                     if (! out_of_args(argc, "-i")) {
  108.                         starting_icon_time = atol(*argv);
  109.                         starting_icon_time = min(50, max(1, starting_icon_time));
  110.                     }
  111.                     break;
  112.                 }
  113.                 case 'p': {
  114.                     /* select the pointer style */
  115.                     extern int cursor_type;
  116.                     argc--; argv++;
  117.                     if (! out_of_args(argc, "-p")) {
  118.                         cursor_type = atol(*argv);
  119.                         cursor_type = min(2, max(0, cursor_type));
  120.                     }
  121.                     break;
  122.                 }
  123.                 case 'r': {
  124.                     /* restore a saved game */
  125.                     argc--; argv++;
  126.                     if (! out_of_args(argc, "-r")) {
  127.                         strcpy(save_file_name, *argv);
  128.                         restoring_game = 1;
  129.                     }
  130.                     break;
  131.                 }
  132.                 case 's': {
  133.                     /* starting skill*/
  134.                     argc--; argv++;
  135.                     if (! out_of_args(argc, "-s")) {
  136.                         starting_skill = atol(*argv);
  137.                         starting_skill = min(2, max(0, starting_skill));
  138.                     }
  139.                     break;
  140.                 }
  141.                 case 't': {
  142.                     /* maximum playing time, in seconds */
  143.                     argc--; argv++;
  144.                     if (! out_of_args(argc, "-t")) {
  145.                         time_to_play = atol(*argv);
  146.                     }
  147.                     break;
  148.                 }
  149.                 case 'w': {
  150.                     /* width of playing windows */
  151.                     argc--; argv++;
  152.                     if (! out_of_args(argc, "-w")) {
  153.                         max_x = max(MINWIN, atol(*argv));
  154.                     }
  155.                     break;
  156.                 }    
  157.                 default: {
  158.                     fprintf(stderr, "Unrecognizable argument '%s'.\n", *argv);
  159.                     break;
  160.                 }
  161.             }
  162.         }
  163.     }
  164. }
  165.  
  166.  
  167. /* the following kludge is necessary because there seems to be no
  168.  * SunView subroutine which sets the default font for all the windows.
  169.  * WIN_FONT explicitly disclaims doing this.  Only -Wt on the argument
  170.  * claims to....
  171.  */
  172. fixup_font(pargc, pargv, font_name)
  173. int *pargc;
  174. char ***pargv;
  175. char *font_name;
  176. {
  177.     int i;
  178.     int argc = *pargc;
  179.     char **argv = *pargv;
  180.     char **new_argv = (char **)calloc(sizeof(char *), argc+3);
  181.     for (i = 1; i < argc; i += 1) {
  182.         new_argv[i+2] = argv[i];
  183.     }
  184.     new_argv[0] = argv[0];
  185.     new_argv[1] = "-Wt";
  186.     new_argv[2] = font_name;
  187.     *pargc += 2;
  188.     *pargv = new_argv;
  189. }
  190.  
  191. open_our_font(s)
  192. char *s;
  193. {
  194.     if ((font = (struct pixfont *)pf_open(s)) == NULL)
  195.         font = (struct pixfont *)pf_default();
  196. }
  197.  
  198. out_of_args(n, s)
  199. char *s;
  200. {
  201.     if (n > 0) {
  202.         return 0;
  203.     } else {
  204.         fprintf(stderr, "Argument '%s' not followed by a value.\n", s);
  205.         /* return 1; */
  206.         exit(1);
  207.     }
  208. }
  209.